<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <script type="text/javascript" src="{{asset('vendor/markdown/js/jquery.min.js')}}"></script>
    <title>Document</title>
</head>

<body>
    <h1>yikang</h1>

    <div id="doc-content" style="width:50%;margin:0 auto">
        <textarea style="display:none;"># GIT
[TOC]

## 配置用户名和邮箱

```
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
```

- global : 全局

## SSH Key

- 首先查看自己的用户主目录下有没有`.ssh`目录,如果有,再看看这个目录下有没有`id_rsa`和`id_rsa.pub`这两个文件,有了就说明你已经有了SSH Key了.
- 没有的话就需要创建SSH key,打开Git Bash,输入`ssh-keygen -t rsa -C "email@example.com"`
- 其中`id_rsa`是私钥,不能泄露出去,`id_rsa.pub`是公钥,**可以**放心告诉任何人.



## git指令

- `git init` : 创建版本库(最好在空目录下创建版本库)
- `git add` 
  - `git add <file1 file2 ...>` : 将文件名为file1和file2的文件添加到暂存区中去
  - `git add .` : 将所有修改和新建的文件添加到暂存区中去
- `git rm <file>` : 从版本库中删除文件   (先手动删除文件，然后使用`git rm <file>`和`git add <file>`效果是一样的。)
  - `git rm -r <file>` : 可以删除文件夹
- `git commit -m <message>` : 将暂存区的所有内容提交到当前分支.
- `git status` : 查看当前暂存区中的状态
- `git diff`
  - `git diff file` : 查看版本和版本,以及版本和工作区的区别,这个版本可能在缓存区,也可能在仓库的当前分支。
  - `git diff HEAD -- <file>` : 查看`file`文件在工作区和版本库里面最新版本的区别
- `git log` : 查看提交日志
  - `git log --pretty=oneline` : 将输出信息简洁成一行
  - `git reflog` : 查看每一次命令信息 (可以查看版本号)
  - `git log --graph` : 查看分支合并图
- `git reset` 
  - `git reset --hard HEAD^` : 将当前版本回退到上个版本,回退前5个版本将`HEAD^`改成`HEAD~5`即可
  - `git reset --hard <commit id>` : 将版本更改为`commit id`对应的版本,此用法既可以前进也可以后退.版本号在书写时没有必要写全,写前5位即可,Git会自动去找
  - `git reset HEAD <file>` : 把暂存区的修改撤销掉（unstage），重新放回工作区
- `git checkout`
  - `git checkout -- <file>` : 把`file`文件在工作区的修改全部撤销,这里有两种情况:
    - 一是`file`自修改后还没有被放到暂存区，现在，撤销修改就回到和版本库一模一样的状态；
    - 一是`file`已经添加到暂存区后，又作了修改，现在，撤销修改就回到添加到暂存区后的状态。
    - 总之，就是让这个文件回到最近一次`git commit`或`git add`时的状态。
  - `git checkout -b <dev>` : 创建`dev`分支，然后切换到`dev`分支,相当于`git branch dev`和`git checkout <dev>`两条命令
  - `git checkout -b <dev> <origin/dev>` : 创建`dev`分支,并从将远程`origin`的`dev`加入本地`dev`中
  - `git checkout <dev>` : 切换分支为`dev`
- `git branch` :　查看当前分支
  - `git branch <name>` : 创建分支
  - `git branch -d <dev>` : 删除`dev`分支
  - `git branch -d <dev>` : 强制删除`dev`分支
  - `git branch --set-upstream-to=<origin/dev> <dev>` : 将远程`origin/dev`与本地`dev`链接起来
- `git switch`(new) : 
  - `git switch -c <dev>` : 创建并切换到新的`dev`分支
  - `git switch master` : 切换分支为`master`
- `git merge <dev>` : 把`dev`分支的工作成果合并到**当前**分支上.
  - `git merge --no-ff -m <message> <dev>` : 禁用`Fast forward`的合并分支方法
- `git push <远程主机名> <本地分支名>:<远程分支名>` : 推送
  - `git push origin <tagname>` : 将某个标签推送到远程
  - `git push origin --tags` : 将全部标签推送到远程
  - `git push origin :refs/tags/<tagname>` : 删除一个远程标签.PS : 想要将本地的删除
- `git pull` : 按照`git branch` 设置的默认跟踪的服务器和分支来拉取。
  - `git pull origin master` : 拉取远程服务器`origin`的`master`分支
- `git stash` : 将当前工作现场暂时存储起来
  - `git stash list` : 查看存储的工作现场的列表
  - `git stash apply <id>`: 恢复存储名为`id`的工作现场
  - `git stash drop` : 删除存储名为`id`的工作现场
  - `git stash pop` : 恢复栈顶的工作现场,并删除
- `git cherry-pick <commit id>` : 将`commit id`中的内容合并到当前分支
- `git remote` : 查看远程库
  - `git remote -v` : 查看本地与远程库的连接状态
- `git rebase` : 把本地未push的分叉提交提示整理成直线
- `git tag` : 查看所有标签
  - `git tag <name>` : 给当前`commit`打上标签名为`name`的标签
  - `git tag <name> <commit id>` : 给指定的`commit id`打上标签
  - `git tag -a <name> -m <message> <commit id>` : `-a`指定标签名，`-m`指定说明文字
  - `git tag -d <name>` : 删除标签
- `git show <tagname>` : 查看当前标签信息



## Linux指令

- `mkdir <files>` : 创建一个名为files的文件夹
- `cd` : 目录指令,可以进入目录和退出目录
- `pwd` : 显示当前目录
- `cat <file>` : 查看名为file的文件
- `rm <file>` : 删除文件
- `ls` : 查看当前目录下的文件
  - `ls -ah` : 查看当前目录下的文件,包括**隐藏文件**

## 远程仓库

#### 把本地仓库的内容推送到GitHub上

`git remote add <origin> <SSh或HTTP地址>` : `origin`是远程库的名称,可以自己修改,但`origin`是Git的默认叫法

`git push -u <origin> master` : 将本地库的内容推送到远程上(通常是第一次将本地仓库推送到远程仓库).由于远程库是空的，我们第一次推送`master`分支时，加上了`-u`参数，Git不但会把本地的`master`分支内容推送的远程新的`master`分支，还会把本地的`master`分支和远程的`master`分支**关联起来**，在以后的推送或者拉取时就可以简化命令。不用每次指令分支

以后在本地做了提交就可以通过命令`git push origin master`把本地`master`分支的最新修改推送至GitHub

#### 从远程库克隆

`git clone <SSH or HTTP address>` : 将远程仓库克隆到本地

## 其他

`git config --global push.default simple` : 设置 Git 命令 push 的默认模式为 `simple`，当我们执行 `git push` 没有指定分支时，自动使用当前分支，而不是报错。



## 小问题

1. git如何删除本地仓库?
   - `rm -rf .git`  即可删除本地仓库
</textarea>
    </div>

    <link rel="stylesheet" href="{{asset('vendor/markdown/css/editormd.min.css')}}" />
    <script type="text/javascript" src="{{asset('vendor/markdown/js/editormd.min.js')}}"></script>
    <script type="text/javascript" src="{{asset('vendor/markdown/lib/marked.min.js')}}"></script>
    <script type="text/javascript" src="{{asset('vendor/markdown/lib/prettify.min.js')}}"></script>
    <script type="text/javascript" src="{{asset('vendor/markdown/lib/raphael.min.js')}}"></script>
    <script type="text/javascript" src="{{asset('vendor/markdown/lib/underscore.min.js')}}"></script>
    <script type="text/javascript" src="{{asset('vendor/markdown/lib/sequence-diagram.min.js')}}"></script>
    <script type="text/javascript" src="{{asset('vendor/markdown/lib/flowchart.min.js')}}"></script>
    <script type="text/javascript" src="{{asset('vendor/markdown/lib/jquery.flowchart.min.js')}}"></script>

    <script type="text/javascript">
        $(function () {
            editormd.markdownToHTML("doc-content", {
                htmlDecode: "style,script,iframe",
                emoji: true,
                taskList: true,
                tex: true, // 默认不解析
                flowChart: true, // 默认不解析
                sequenceDiagram: true, // 默认不解析
                codeFold: true,
            });
        });
    </script>
</body>

</html>